package com.xiaoc.bulldozer.common.util;

import org.apache.commons.lang3.StringUtils;

import com.xiaoc.bulldozer.common.ConfigKeys;
import com.xiaoc.bulldozer.common.dao.PhoneLocationMapper;
import com.xiaoc.bulldozer.common.model.PhoneLocation;
import com.xiaoc.bulldozer.common.service.cache.CommonConfigCacheService;

public class VerifyUtil {
    /**
     * 校验18位身份证号
     */
    public static boolean verifyIdentityNo(String identityNo) {
        if (!identityNo.matches("^\\d{17}(\\d|x|X)$")) return false;
        // 校验第18位
        // 先对前17位数字的权求和，S = Sum(Ai * Wi)，i取值从0到16
        // Ai:表示第i位置上的身份证号码数字值
        // Wi:表示第i位置上的加权因子，按顺序排列共17个：7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
        char[] arr = identityNo.toCharArray();
        int[] w = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; //加权因子
        int sum = 0;
        for (int i = 0; i < 17; i++) {
            sum = sum + Integer.parseInt(arr[i] + "") * w[i];
        }
        // 通过模得到对应的校验码，共有11个取值，对应校验码数组下标
        int y = sum % 11;
        // 第18位校验码按顺序排列: 1 0 X 9 8 7 6 5 4 3 2
        String[] v = {"1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2"};
        if (!v[y].equalsIgnoreCase(arr[17] + "")) return false;
        return true;
    }

    /**
     * 判断用户是否有效(是否在宜昌)
     */
    public static Boolean checkAccountStatus(String address, String phoneNumber, String identityNo, PhoneLocationMapper phoneLocationMapper, CommonConfigCacheService commonConfigService) {
        if (StringUtils.isBlank(phoneNumber) || StringUtils.isBlank(identityNo) || phoneNumber.length() < 11) {
            return false;
        }

        // 根据身份证判断是否当地人
        String[] localIdNoArray = StringUtils.replace(commonConfigService.getValue(ConfigKeys.LOCAL_IDCARD), "，", ",").split(",");
        for (String no : localIdNoArray) {
            if (identityNo.startsWith(no)) {
                return true;
            }
        }

        // 根据微信定位功能判断是否当地人
        if (StringUtils.isNotBlank(address) && address.contains(commonConfigService.getValue(ConfigKeys.LOCAL_ADDREDD))) {
            return true;
        }

        String phoneHead = StringUtils.substring(phoneNumber, 0, 7);

        PhoneLocation phoneLocation = phoneLocationMapper.getPhoneLocationByPhoneHead(phoneHead);
        if (phoneLocation != null) {
            return true;// 根据手机号归属地判断是否当地人
        }

        return false;
    }


}

